/**
 * desc:
 * User: zhitao.guo@leweipai.cn
 * Date: 2021/8/16
 * Time: 16:41
 */

import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";
// 游戏控制类， 控制其他的所有类
class GameControl {
    // 定义三个属性
    // 蛇
    snake: Snake;
    // 食物
    food: Food;
    // 计分牌
    scorePanel: ScorePanel;

    // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
    direction: string = '';
    // 创建一个属性来记录游戏是否结束
    isLive: boolean = true;

    constructor() {
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel();
        this.init();
    }

    // 游戏的初始化方法，调用后开始游戏
    init () {
        // 绑定键盘案件按下的事件
        document.addEventListener('keydown', this.keyDownHandler.bind(this))
        // 调用run方法 使蛇移动
        this.run()

    }
    // 创建一个键盘按下的响应函数
    keyDownHandler (event: KeyboardEvent) {
        /**
         * ArrowUp 上箭头 Up
         * ArrowLeft 左箭头 Left
         * ArrowRight 右箭头 Right
         * ArrowDown 下箭头 Down
         */
        // 需要检查 event.key 是否合法 （用户是否按了正确的按键）
        // 修改direction属性
        this.direction = event.key
    }

    // 创建一个控制蛇移动的方法
    run () {
        /**
         * 根据方向（this.direction）来使蛇的位置改变
         *      向上 top减少
         *      向下 top 增加
         *      向左 left 减少
         *      向右 left 增加
         */
        // 获取蛇现在的坐标
        let X = this.snake.X;
        let Y = this.snake.Y;

        // 根据按键的方向修改 值
        switch (this.direction) {
            case "Up":
            case "ArrowUp":
                // 向上移动
                Y -= 10;
                break;

            case "Down":
            case "ArrowDown":
                // 向下移动
                Y += 10;
                break;

            case "Left":
            case "ArrowLeft":
                // 向左移动
                X -= 10;
                break;

            case "Right":
            case "ArrowRight":
                // 向右移动
                X += 10;
                break;
        }
        // 检查蛇是否吃到了食物
        this.checkEat(X, Y)

        // 修改蛇的X 和 Y值
        try {
            this.snake.X = X;
            this.snake.Y = Y;
        } catch (e) {
            // 出现了异常，游戏结束，弹出提示信息
            alert(e.message + ' GAME OVER');
            // 将isLive 设置成false
            this.isLive = false;
        }


        // 开启一个定时调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
    }

    // 定义一个方法，用来检查蛇是否迟到食物
    checkEat (X: number, Y: number) {
        if(X === this.food.X && Y === this.food.Y) {
            this.food.change();
            // 分数增加
            this.scorePanel.addScore();
            // 蛇要增加一节
            this.snake.addBody();
        }
    }
}
export default GameControl;
